/* 
基础数据类型
1. boolean
2. number
3. string
4. null和undefined
5. 数组
6. 元组(Tuple) 
7. 枚举(enum)
8. any
9. void
10. object
*/

(function () {
  // 1. boolean
  let isDone: boolean = false
  isDone = true
  // isDone = 123  // error

  // 2. number
  let age: number = 23
  // age = '123'  // error

  // 3. string
  let name: string = 'tom'
  // name = 23  // error
  let info: string = `我叫${name}, 今年${age}`

  // 4. null和undefined   // 都只有一个值
  // null和undefined类型是其它任意类型的子类型
  let n: null = null
  let u: undefined = undefined
  name = null
  name = undefined

  // 5. 数组
  let arr1: number[] = [12/* , 'abc' */]
  let arr2: Array<string> = ['abc'/* , 12 */]

  // 6. 元组(Tuple)  确定了元素个数和类型的数组
  let ts: [number, string]
  ts = [12, 'abc'/* , true */]

  // 7. 枚举(enum)
  enum Color {
    RED = 1,
    GREEN,
    BLUE
  }
  console.log(Color)

  let myColor: Color = Color.RED
  console.log(myColor, Color.GREEN, Color[myColor])


  // 8. any
  let arr3: any[] = [12, true]
  arr3.push('abc')

  // 9. void   代表函数没有返回值
  function fn(): void {
    // return 12  // error
    // return undefined
    // return null
    // return 'abc'  // error
  }

  // 10. object 
  function fn2(): object {
    return {}
    // return () => {}
    // return []
    // return null
    // return undefined
    // return 123 // error
  }
 
})()

/* 
强类型的好处:
  正确语法的提示补全  
  错误语法的错误提示
*/